package com.bincloud.vue.admin.web.util.token;

import org.springframework.security.core.userdetails.UserDetails;

import java.util.Date;
import java.util.Map;

/**
 * jwt token 接口
 * @author bincloud, mvpzhou
 */
public interface TokenService {
    /**
     * 根据负责生成 jwt 的 token
     *
     * @param claims 负载
     * @return token
     */
    String generateToken(Map<String, Object> claims);

    /**
     * 从 token 中获取 jwt 中的负载中的用户名
     *
     * @param token jwt token
     */
    String getUsername(String token);

    /**
     * 验证 token 是否还有效
     *
     * @param token       客户端传入的 token
     * @param userDetails 从数据库中查询出来的用户信息
     */
    boolean validateToken(String token, UserDetails userDetails);

    /**
     * 生成 token 信息
     *
     * @param userDetails 从数据库中查询出来的用户信息
     * @return token
     */
    String generateToken(UserDetails userDetails);

    /**
     * 刷新 token 信息
     * 1.原token 无法被作废，需引进缓存
     * 2.若过期时间小于某时间，仍会出现无法作废，此处不做处理，统一由缓存进行存储
     *
     * @param token 原 token
     * @return token
     */
    String refreshToken(String token);

    /**
     * 从 token 中获取 jwt 中的负载中的过期时间
     *
     * @param token jwt token
     * @return 过期时间
     */
    Date getExpired(String token);

    /**
     * 判断 token 是否已经失效
     *
     * @param token jwt token
     * @return 是否失效
     */
    boolean isExpired(String token);

    /**
     * 判断 token 是否未失效
     *
     * @param token jwt token
     * @return 是否未失效
     */
    boolean isNotExpired(String token);
}
